//
//  DataBaseManager.m
//  UI18_数据库
//
//  Created by dlios on 15-5-5.
//  Copyright (c) 2015年 lanou3g.com 蓝鸥科技. All rights reserved.
//

#import "DataBaseManager.h"

@implementation DataBaseManager
+ (DataBaseManager *)shareInstance
{
    static DataBaseManager *dbManager = nil;
    if (dbManager == nil) {
        dbManager = [[DataBaseManager alloc] init];
    }
    return dbManager;
}
// 打开数据库
- (void)openDB
{
    // 数据库一般存放在documents文件夹下
    // 获取document文件路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    // 拼接数据库路径
    NSString *dbPath = [path stringByAppendingPathComponent:@"lol.db"];
    // 创建数据库
    // 检测路径下 是否已经存在数据库 如果不存在 才创建(查看sqlite3指针是否指向了数据库)
    // 参数1: 本地数据库的路径(需要UTF-8转码)
    // 参数2: 数据库指针地址
    int result = sqlite3_open([dbPath UTF8String], &dbPoint);
    NSLog(@"打开结果: %d, path: %@", result, dbPath);
}

// 关闭数据库
- (void)closeDB
{
    sqlite3_close(dbPoint);
     
}
// 创建表
//- (BOOL)createTable
//{
//    // 1.创建数据库的替身 用于临时存储和操作数据
//    sqlite3_stmt *stmt = nil;
//    // 2.准备sql语句
//    // 参数1: 数据库指针
//    // 参数2: sql语句
//    // 参数3: 语句限制长度(-1表示不限)
//    // 参数4: 数据库替身
//    // 返回值: 数据库sql语句准备操作完成状态(0表示OK/成功)
//    // sql语句中: text表示字符串 integer表示整形
//    int result = sqlite3_prepare_v2(dbPoint, "create table student (name text, age integer, num integer primary key)", -1, &stmt, NULL);
//    NSLog(@"%d", result);
//    // 3.检查语句准备结果
//    if (SQLITE_OK == result) {
//        // 4.执行语句
//        int r = sqlite3_step(stmt);
//        // 5.判断执行结果
//        if (SQLITE_DONE == r) {
//            // 6.销毁替身
//            sqlite3_finalize(stmt);
//            return YES;
//        }
//    }
//    sqlite3_finalize(stmt);
//    return NO;
//}

// 创建表简化方法
- (void)createTable
{
    // 1.创建sql语句
    NSString *createSQL = @"create table if not exists lanou03 (name text, age integer, num integer primary key autoincrement)";
    // 2.执行sql语句
    // 参数1: 数据库指针
    // 参数2: sql语句
    int result = sqlite3_exec(dbPoint, createSQL.UTF8String, NULL, NULL, nil);
    // 3.判断
    if (SQLITE_OK == result) {
        NSLog(@"创建表成功");
    } else {
        NSLog(@"创建表失败");
    }
}
// 插入对象信息
- (void)insertInfoWithLanou03:(lanou03 *)lanou
{
    // 1.创建sql语句
    NSString *insertStr = [NSString stringWithFormat:@"insert into lanou03 (name, age) values ('%@', '%ld')", lanou.name, lanou.age];
    // 2.执行语句
    int result = sqlite3_exec(dbPoint, insertStr.UTF8String, NULL, NULL, nil);
    // 3.判断
    if (SQLITE_OK == result) {
        NSLog(@"插入成功");
    } else {
        NSLog(@"插入失败");
    }
}

// 更新对象信息
- (void)updateInfoWithLanou03:(lanou03 *)lanou number:(NSInteger)num
{
    // 1.创建sql语句
    NSString *updateSQL = [NSString stringWithFormat:@"update lanou03 set name = '%@', age = '%ld' where num = '%ld'", lanou.name, lanou.age, num];
    // 2.执行语句
    int result = sqlite3_exec(dbPoint, updateSQL.UTF8String, NULL, NULL, nil);
    // 3.判断
    if (SQLITE_OK == result) {
        NSLog(@"更新成功");
    } else {
        NSLog(@"更新失败");
    }
}

// 查询
- (NSMutableArray *)selectInfo
{
    // 查询操作逻辑
    // 1.从本地数据获取所有信息 遍历获取每条信息
    // 2.把每条信息转化为Model对象
    // 3.把Model添加在可变数组中返回
    
    // 1.创建sql语句
    // select * 查询所有
    NSString *selectSQL = @"select * from lanou03";
    // 2.创建数据库替身
    sqlite3_stmt *stmt = nil;
    // 3.准备sql语句
    // prepare_v2函数 把数据库对象/sql语句/数据库替身 关联在了一起
    int result = sqlite3_prepare_v2(dbPoint, selectSQL.UTF8String, -1, &stmt, nil);
    // 4.创建存放返回数据的信息数组
    NSMutableArray *arr = [NSMutableArray array];
    // 5.判断查询准备
    if (SQLITE_OK == result) {
        NSLog(@"查询准备成功");
        // 6.开始遍历每一行信息
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            // 当数据库提升指向的数据符合查询条件 在while中返回
            // 逐行 获取每一列的数据
            // 列数从0开始
            const unsigned char *name = sqlite3_column_text(stmt, 0);
            int age = sqlite3_column_int(stmt, 1);
            int num = sqlite3_column_int(stmt, 2);
            
            // 访问到数据库数据 转化添加在Model中
            lanou03 *temp = [[lanou03 alloc] init];
            temp.name = [NSString stringWithUTF8String:(const char *)name];
            temp.age = age;
            temp.num = num;
            // 把Model对象添加在数组中
            [arr addObject:temp];
        }
    }
    else {
        NSLog(@"查询准备失败");
    }
    return arr;
}

// 删除
- (void)deleteInfoWithNum:(NSInteger)num
{
    // 1.创建sql语句
    NSString *deleteSQL = [NSString stringWithFormat:@"delete from lanou03 where num = '%ld'", num];
    // 2.执行语句
    int result = sqlite3_exec(dbPoint, deleteSQL.UTF8String, NULL, NULL, nil);
    // 3.判断
    if (result == SQLITE_OK) {
        NSLog(@"删除成功");
    } else {
        NSLog(@"删除失败");
    }
}
// 删除表
- (void)dropTable
{
    // 1.sql语句
    NSString *dropSQL = @"drop table lanou03";
    // 2.执行
    int result = sqlite3_exec(dbPoint, dropSQL.UTF8String, NULL, NULL, nil);
    // 3.判断
    if (result == SQLITE_OK) {
        NSLog(@"删除表成功");
    } else {
        NSLog(@"删除表失败");
    }
}
@end
